/**
 * @constructor 全局共用方法
 * @param { string } title - 全局 公用方法定义
 * @param { string } author - Sky_sjr
 * */
import { Toast } from 'vant';

// 存储类型
const STORAGETYPE = window.localStorage;

const common = {
  /**************************** 存储相关 ****************************/
  /**
     * @description 设置本地存储方法
     * @param {string} key 键
     * @param {any} value 值
     * @param {number} time 时效 默认24小时
     * */
  setStorage(key, value, time = 24) {
    const now = new Date();
    const item = {
      value: value,
      expiration: now.getTime() + (time * 60 * 60 * 1000)
    };
    STORAGETYPE.setItem(key, JSON.stringify(item));
  },
  /**
   * @description 获取本地存储
   * @param {string} key 键
   * */
  getStorage(key) {
    const item = STORAGETYPE.getItem(key);
    if (item) {
      const parsedItem = JSON.parse(item);
      const now = new Date().getTime();
      if (now > parsedItem.expiration) {
        STORAGETYPE.removeItem(key);
        return null; // 数据已过期，返回null
      }
      return parsedItem.value;
    }
    return null; // 未找到对应数据
  },
  /**
   * @description 移除本地存储
   * @param {string} key 键
   * */
  removeStorage(key) {
    STORAGETYPE.removeItem(key);
  },

  /**************************** 手机号码相关 ****************************/
  /**
   * @description 验证手机号号码是否合法
   * @param {string} phoneNumber 电话号码
   * */
  validatePhoneNumber(phoneNumber) {
    // 中国大陆手机号码的正则表达式
    const regex = /^1[3-9]\d{9}$/;
    return regex.test(phoneNumber);
  },
  /**
   * @description 替换电话号码中间四位 153****0011
   * @param { string } phoneNumber 电话号码
   * */
  replacePhoneNumber(phoneNumber) {
    // 使用正则表达式匹配手机号码中间的四位数字
    const regex = /(\d{3})\d{4}(\d{4})/;
    // 将匹配到的部分替换为"****"
    const maskedPhoneNumber = phoneNumber.replace(regex, '$1****$2');
    return maskedPhoneNumber;
  },
  /**
   * @description 短横线格式化电话号码 按照3-4-4格式划分电话号码 123-4567-8910
   * @param { string } mobile
   * */
  shortDashesformatPhoneNumber(mobile) {
    let mobileReg = /(?=(\d{4})+$)/g
    return mobile.replace(mobileReg, '-')
  },
  /**
   * @description 格式化电话号码 按照 每4位数字之后添加一个空格（1234 5678 910 ）的格式划分
   * @param { string } tel 电话号码
   * */
  formatPhoneNumber(tel) {
    return tel.replace(/(\d{4})(?=\d)/g, '$1 ');
  },

  /**************************** 地址栏相关 ****************************/
  /**
   * @description 判断URL的前缀是HTTPS还是HTTP
   * @param {string} url 需要检查的url地址
   * */
  isCheckProtocol(url) {
    const checkProtocol = /^https?:/
    return checkProtocol.test(url)
  },
  /**
   * @description 解析链接上的搜索参数
   * @param {string} name 值
   * */
  getQueryByName(name) {
    const queryNameRegex = new RegExp(`[?&]${name}=([^&]*)(&|$)`)
    const queryNameMatch = window.location.search.match(queryNameRegex)
    return queryNameMatch ? decodeURIComponent(queryNameMatch[1]) : ''
  },

  /**************************** 数组、对象相关 ****************************/
  /**
   * @description 数组对象去重
   * @param {Array[obj]} arr 需要去重的对象
   * */
  arrayObjectDeduplication(arr) {
    const uniqueSet = new Set(arr.map(JSON.stringify));
    const uniqueArray = Array.from(uniqueSet).map(JSON.parse);
    return uniqueArray
  },
  /**
   * @description 判断对象中所有值是否为空
   * @param { Object } 需要判断的对象
   * */
  isObjectEmpty(obj) {
    for (var key in obj) {
      if (
        obj.hasOwnProperty(key) &&
        obj[key] !== null &&
        obj[key] !== undefined &&
        obj[key] !== ""
      ) {
        return false;
      }
    }
    return true;
  },

  /**************************** 时间日期相关 ****************************/
  /**
   * @description 时间格式化 默认 Day
   * @param {string | Date} time 需要处理的时间
   * @param {string} format   返回日期格式 Year | Month | Day | Hour | Minute | Second
   * */
  timeFormatting(time, format = "Day") {
    const times = new Date(time)
    let YYYY = times.getFullYear(),
      MM = times.getMonth() + 1,
      DD = times.getDate(),
      hh = times.getHours(),
      mm = times.getMinutes(),
      ss = times.getSeconds();

    MM = MM < 10 ? `0${MM}` : MM
    DD = DD < 10 ? `0${DD}` : DD
    hh = hh < 10 ? `0${hh}` : hh
    mm = mm < 10 ? `0${mm}` : mm
    ss = ss < 10 ? `0${ss}` : ss

    const formatObj = {
      'Year': `${YYYY}`,
      'Month': `${YYYY}-${MM}`,
      'Day': `${YYYY}-${MM}-${DD}`,
      'Hour': `${YYYY}-${MM}-${DD} ${hh}`,
      'Minute': `${YYYY}-${MM}-${DD} ${hh}:${mm}`,
      'Second': `${YYYY}-${MM}-${DD} ${hh}:${mm}:${ss}`,
    }
    return formatObj[format]
  },

  /**************************** 金额相关 ****************************/
  /**
   * @description 货币格式化  100,000.00
   * @param { string | number } number 需要格式化的数字
   * @param { number } format 格式化保留小数位数，不传默认保存两位小数
   * */
  formatMoney(money, format = 2) {
    const _number = Number(money)
    const _format = format
    const formattedNumber = _number.toLocaleString('en-US', { minimumFractionDigits: _format, maximumFractionDigits: _format })
    return formattedNumber
  },


  /**************************** 邮箱相关 ****************************/
  /**
   * @description 验证电子邮箱是否合法
   * @param { string } email 需要验证的邮箱
   * */
  isValidEmail(email) {
    // 电子邮箱的正则表达式
    const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
    return emailRegex.test(email);
  },

  /**************************** 其他 ****************************/
  /**
     * @description 文件流下载
     * @param {string} url 文件下载地址
     * @param {string} fileName 文件名称
     * */
  downloadFile(url, fileName) {
    const _total = Toast.loading({
      message: '下载中请稍后...',
      forbidClick: true,
    })
    const xhr = new XMLHttpRequest();
    xhr.open('GET', url, true);
    xhr.responseType = 'blob';
    xhr.onload = () => {
      if (xhr.status === 200) {
        // 获取文件
        const blob = xhr.response;
        // 创建a标签
        const a = document.createElement('a');
        a.href = window.URL.createObjectURL(blob);
        a.download = fileName;
        a.style.display = 'none';
        document.body.appendChild(a);
        a.click();
        Toast.success('下载成功！')

        // 移除a标签
        window.URL.revokeObjectURL(a.href);
        document.body.removeChild(a);
      } else {
        Toast.fail('下载失败');
      }
      _total.clear()
    }
    xhr.send();
  },
  /**
   * @description 复制内容到剪贴板
   * @param {string} content 需要复制的内容
   * */
  copyToClipboard(content) {
    const textarea = document.createElement("textarea")
    textarea.value = content
    document.body.appendChild(textarea)
    textarea.select()
    document.execCommand("Copy")
    textarea.remove()
    Toast.success('复制成功！')
  },
  /**
  * @description 生成 uuid
  * @param 返回 随机uuid
  * */
  generateUUID() {
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
      var r = Math.random() * 16 | 0,
        v = c == 'x' ? r : (r & 0x3 | 0x8);
      return v.toString(16);
    });
  },
  /**
  * @description 去除字符串的前导和尾随空格
  * @param {string} str 需要去除的字符串
  * */
  removeStringExcessSpaces(str) {
    // 方式一
    // return str.replace(/^\s*(.*?)\s*$/g, '$1')
    // 方式二
    return str.replace(/^\s*|\s*$/g, '')
  },
  /**
  * @description 判断当前设备是否是移动端
  * @param 返回 true 是移动端； false 不是移动端
  * */
  isMobileDevice() {
    return navigator.userAgent.match(
      /(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i
    );
  },
}


export default common